package com.example.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OssConfig {

    // OSS 服务地域节点（如：oss-cn-hangzhou.aliyuncs.com），用于定位目标区域的 OSS 服务
    @Value("${oss.endpoint}")
    private String endpoint;

    // AccessKeyId：优先读取环境变量，其次读取 application.yml（使用 : 提供默认空字符串，避免 NPE）
    @Value("${oss.accessKeyId:}")
    private String accessKeyId;

    // AccessKeySecret：优先读取环境变量，其次读取 application.yml（使用 : 提供默认空字符串，避免 NPE）
    @Value("${oss.accessKeySecret:}")
    private String accessKeySecret;

    /**
     * 创建并注册 OSS 客户端 Bean（单例）。
     * - 官方推荐用法：通过 OSSClientBuilder.build(endpoint, ak, sk) 构建客户端。
     * - 安全性：优先使用环境变量中的 AK/SK，便于线上运维与密钥轮换；若未配置则回退至 yml。
     * - 资源管理：destroyMethod = shutdown，保证容器关闭时释放底层连接资源。
     */
    @Bean(destroyMethod = "shutdown")
    public OSS ossClient() {
        // 优先环境变量，其次 yml
        String ak = System.getenv("OSS_ACCESS_KEY_ID");
        if (ak == null || ak.isEmpty())
            ak = accessKeyId;
        String sk = System.getenv("OSS_ACCESS_KEY_SECRET");
        if (sk == null || sk.isEmpty())
            sk = accessKeySecret;
        if (ak == null || ak.isEmpty() || sk == null || sk.isEmpty()) {
            throw new IllegalStateException("OSS AccessKeyId/Secret 未配置，请设置环境变量或 application.yml");
        }
        // build(...) 完成鉴权配置
        return new OSSClientBuilder().build(endpoint, ak, sk);
    }
}
